﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

namespace Noris.Tools.TraceVisualiser.Forms
{
    #region interface IMasterDetails : předpis pro objekt, který má své jméno a nese sadu detailních informací (IEnumerable<KeyValuePair<string, object>> Details)
    /// <summary>
	/// interface IMasterDetails : předpis pro objekt, který má své jméno a nese sadu detailních informací (IEnumerable«MasterDetailItem» Details)
    /// </summary>
    public interface IMasterDetails
    {
        /// <summary>
        /// Název objektu, který nese sadu detailů
        /// </summary>
        string MasterName { get; }
        /// <summary>
        /// Barva položky, Empty = defaultní
        /// </summary>
        Color DetailBackColor { get; }
        /// <summary>
        /// Soupis detailů, kde Key = název detailu a Value = hodnota
        /// </summary>
		IEnumerable<MasterDetailItem> Details { get; }
    }
	/// <summary>
	/// Třída pro zachycení jedné položky zobrazované v detailu
	/// </summary>
	public class MasterDetailItem
    {
        #region Konstrukce
        public MasterDetailItem()
		{
			this.Name = "";
			this.Value = null;
			this.ShowInDetail = false;
			this.ShowInGrid = false;
		}
		public MasterDetailItem(string name, object value)
		{
			this.Name = name;
			this.Value = value;
            this.OptimalSize = Size.Empty;
            this.ShowInDetail = true;
			this.ShowInGrid = true;
		}
        public MasterDetailItem(string name, object value, Size optimalSize)
        {
            this.Name = name;
            this.Value = value;
            this.OptimalSize = optimalSize;
            this.ShowInDetail = true;
            this.ShowInGrid = true;
        }
		public MasterDetailItem(string name, object value, bool showInDetail, bool showInGrid)
		{
			this.Name = name;
			this.Value = value;
            this.OptimalSize = Size.Empty;
            this.ShowInDetail = showInDetail;
			this.ShowInGrid = showInGrid;
		}
        public MasterDetailItem(string name, object value, Size optimalSize, bool showInDetail, bool showInGrid)
        {
            this.Name = name;
            this.Value = value;
            this.OptimalSize = optimalSize;
            this.ShowInDetail = showInDetail;
            this.ShowInGrid = showInGrid;
        }
        public override string ToString()
        {
            return "Name=" + this.Name + "; Value=" + Convert.ToString(this.Value);
        }
		/// <summary>
		/// Jméno - název sloupce/řádku, jednoznačný klíč
		/// </summary>
		public string Name { get; set; }
		/// <summary>
		/// Hodnota
		/// </summary>
		public object Value { get; set; }
        /// <summary>
        /// Optimální velikost (výška / šířka), Empty = neurčeno
        /// </summary>
        public Size OptimalSize { get; set; }
		/// <summary>
		/// Zobrazovat v detailu
		/// </summary>
		public bool ShowInDetail { get; set; }
		/// <summary>
		/// Zobrazovat v gridu
		/// </summary>
		public bool ShowInGrid { get; set; }
        #endregion
        #region Statické konstruktory pro některé oblíbené hodnoty
        public static MasterDetailItem LevelInfo { get { return new MasterDetailItem("Level", "Info", new Size(80, 0), false, true); } }
        public static MasterDetailItem LevelWarning { get { return new MasterDetailItem("Level", "Warning", new Size(80, 0), false, true); } }
        public static MasterDetailItem LevelError { get { return new MasterDetailItem("Level", "Error", new Size(80, 0), false, true); } }
        #endregion
    }
    #endregion
	#region interface IFormStatusbar : předpis pro objekt, který dovoluje komunikovat se svým status barem
	/// <summary>
	/// interface IFormStatusbar : předpis pro objekt, který dovoluje komunikovat se svým status barem
	/// </summary>
	public interface IFormStatusbar
	{
        /// <summary>
        /// Touto metodou se do status baru vkládají potřebné texty / ikony / stav progress baru.
        /// </summary>
        /// <param name="item">Druh údaje</param>
        /// <param name="value">Vkládaná hodnota.
        /// Hodnota null typicky zhasne progress, vynuluje text + ikonu.
        /// Do textových prvků lze vložit String nebo Image.
        /// Do progresu lze vložit decimal nebo float číslo udávající poměr 0 až 1, anebo int jakožto počet procent 0 až 100.</param>
		void StatusBarSet(StatusBarItem item, object value);
	}
	/// <summary>
	/// Jednotlivé položky status baru, do kterých lze vkládat hodnotu
	/// </summary>
	public enum StatusBarItem
	{
        /// <summary>
        /// Žádná položka
        /// </summary>
		None = 0,
        /// <summary>
        /// Položka s ikonou
        /// </summary>
		Icon,
        /// <summary>
        /// Text s verzí
        /// </summary>
		Version,
        /// <summary>
        /// Ikona + hlavní text, největší prvek status baru
        /// </summary>
		MainText,
        /// <summary>
        /// Ikona + text o stavu (stav načítání, počet požadavků, atd)
        /// </summary>
		StatusText,
        /// <summary>
        /// Text o stavu paměti (ikona je napevno)
        /// </summary>
		MemoryText,
        /// <summary>
        /// Progress bar. Jako Value se předává decimal nebo float poměr v rozmezí 0 až 1, nebo int počet procent, nebo null pro zhasnutí.
        /// </summary>
		Progress
	}
	#endregion
    #region enum EventDetailViewMode : režim zobrazení dat v okně DetailForm
    /// <summary>
    /// Režim okna s detaily (EventDetailForm.ViewMode)
    /// </summary>
    public enum EventDetailViewMode
    {
        None,
        Detail,
        Grid
    }
    #endregion
    #region enum ToolItemProperties : Vlastnosti položky menu
    /// <summary>
    /// Vlastnosti položky menu, ukládají se do Tagu. Vlastnosti lze sčítat.
    /// </summary>
    [Flags]
    public enum ToolItemProperties
    {
        None = 0,
        EnabledDependOnTrace = 1
    }
    /// <summary>
    /// Konkrétní druh položky toolbaru (jak se má položka vygenerovat)
    /// </summary>
    public enum ToolItemType
    {
        None = 0,
        ToolStripMenuItem,
        ToolStripButton,
        ToolStripSplitButton,
		ToolStripDropDownButton
    }
    #endregion
}
